Dans cette partie du cours vous allez apprendre à réorganiser des tables dans R. Cela peur être utile si vous ne devez travailler que sur une partie des données.
Aujourd’hui nous allons voir:
Comment filtrer des lignes ou des colonnes dans un tableau
Exporter le nouveau tableau créé dans R
Tout d’abord, créez un nouveau script R et préparez votre environnement de travail:
# Chargez la librairie `tidyverse` (aide: utilisez la fonction `library()`)
# Changez votre répertoire de travail pour être dans `session3_plots_reorganisation`
#(aide: utilisez la fonction `setwd()`)
# Importer `burghardt_et_al_2015_expt1.txt` et mettez le dans un objet appelé `expt1`
#(aide: utilisez la fonction `read_tsv()`)
select()Tout d’abord, utilisons les fonctions dim() et names() afin de connaitre les dimensions du tableau et le nom des colonnes.
dim(expt1)
## [1] 957 15
names(expt1)
## [1] "plant_nb" "genotype" "background"
## [4] "temperature" "fluctuation" "day.length"
## [7] "vernalization" "survival.bolt" "bolt"
## [10] "days.to.bolt" "days.to.flower" "rosette.leaf.num"
## [13] "cauline.leaf.num" "blade.length.mm" "total.leaf.length.mm"
Il y a beaucoup de colonnes dans ce tableau. Afin de ne garder que les colonnes genotype et temperature, nous pouvons utiliser la fonction select()
select(expt1, genotype, temperature)
## # A tibble: 957 x 2
## genotype temperature
## <chr> <dbl>
## 1 Col Ama 12
## 2 Col Ama 12
## 3 Col Ama 12
## 4 Col Ama 12
## 5 Col Ama 12
## 6 Col Ama 12
## 7 Col Ama 12
## 8 Col Ama 12
## 9 Col Ama 12
## 10 Col Ama 12
## # … with 947 more rows
Il est aussi possible de ne garder que les colonnes qui contiennent le mot “bolt” dans leur nom:
select(expt1, contains("bolt"))
## # A tibble: 957 x 3
## survival.bolt bolt days.to.bolt
## <chr> <chr> <dbl>
## 1 Y Y 28
## 2 Y Y 29
## 3 Y Y 31
## 4 Y Y 31
## 5 Y Y 32
## 6 Y Y 33
## 7 Y Y 34
## 8 Y Y 35
## 9 Y Y 69
## 10 Y Y 72
## # … with 947 more rows
Exercice 1 : Sélectionnez les colonnes qui contiennent des données mesurées en mm
filter()Avec la fonction filter(), nous pouvons garder toutes les lignes de notre table qui correspondent à des plantes qui ont subies une vernalisation.
Tout d’abord, nous devons connaitre les différentes valeurs de la colonne vernalization. Comme nous pouvons voir, il y a deux options: ‘NV’ et ‘V’.
distinct(expt1, vernalization)
## # A tibble: 2 x 1
## vernalization
## <chr>
## 1 NV
## 2 V
Comme nous voulons garder les plantes qui ont subies une vernalisation, nous devons filtrer les données pour garder les lignes pour lesquelles il y a “V” dans la colonne vernalization:
filter(expt1, vernalization == "V")
## # A tibble: 330 x 15
## plant_nb genotype background temperature fluctuation day.length vernalization
## <dbl> <chr> <chr> <dbl> <chr> <dbl> <chr>
## 1 1 Col Ama Col 12 Con 16 V
## 2 2 Col Ama Col 12 Con 16 V
## 3 3 Col Ama Col 12 Con 16 V
## 4 4 Col Ama Col 12 Con 16 V
## 5 5 Col Ama Col 12 Con 16 V
## 6 6 Col Ama Col 12 Con 16 V
## 7 7 Col Ama Col 12 Con 16 V
## 8 8 Col Ama Col 12 Con 16 V
## 9 1 Col Ama Col 12 Con 8 V
## 10 2 Col Ama Col 12 Con 8 V
## # … with 320 more rows, and 8 more variables: survival.bolt <chr>, bolt <chr>,
## # days.to.bolt <dbl>, days.to.flower <dbl>, rosette.leaf.num <dbl>,
## # cauline.leaf.num <dbl>, blade.length.mm <dbl>, total.leaf.length.mm <dbl>
Nous pouvons utiliser les opérateurs suivant pour définir les conditions pour filtrer les données:
| Opérateur | Condition de sélection | Exemple |
|---|---|---|
< |
inférieur à | filter(expt1, days.to.bolt < 20) |
<= |
inférieur ou égal à | filter(expt1, days.to.bolt <= 20) |
> |
supérieur à | filter(expt1, days.to.bolt > 20) |
>= |
supérieur ou égal à | filter(expt1, days.to.bolt >= 20) |
== |
égal à | filter(expt1, days.to.bolt == 20) |
!= |
différent de | filter(expt1, days.to.bolt != 20) |
%in% |
est contenu dans | filter(expt1, genotype %in% c("Col FRI", "Ler-1")) |
Il est aussi possible de combiner plusieurs conditions de sélection avec les opérateurs suivant:
| Opérateur | Signification | Exemple |
|---|---|---|
& |
ET | filter(expt1, days.to.bolt == 20 & genotype == "Ler-1") |
| |
OU | filter(expt1, rosette.leaf.num < 8 | rosette.leaf.num > 100) |
Nous pouvons aussi identifier les données manquantes (NA) avec la fonction is.na() ou sa négation (en utilisant !):
| Opérateur | Signification | Exemple |
|---|---|---|
is.na() |
données manquante | filter(expt1, is.na(rosette.leaf.num)) |
!is.na() |
donnée non manquante | filter(expt1, !is.na(rosette.leaf.num)) |
Par exemple, nous pouvons sélectionner les plantes qui ont été vernalisées ET qui ont poussées avec une température fluctuante:
filter(expt1, vernalization == "V" & fluctuation == "Var")
Il est aussi possible de sélectionner les plantes qui ont poussées avec 8h de jours OU qui fleurissent tardivement:
filter(expt1, day.length == "8" | days.to.bolt > 85)
Exercice 2: Filtrez les données pour garder les plantes selon les 3 cas de figures suivant (indépendants les uns des autres):
- Plantes qui ne sont pas du background Ler et qui ont été traitées avec une température fluctuante.
- Plantes qui ont fleuries (bolt) en moins de 57 jours et qui ont moins de 40 feuilles de rosette
- Plantes du génotype fca-6 pour qui le blade.length.mm n’est pas manquant
Aujourd’hui, nous avons fortement restructuré notre tableau. Nous pouvons le sauver pour le réutiliser ultérieurement.
Pour cela nous utilisons la fonction write_tsv()
Par exemple, imaginons que nous voulons enlever des données manquantes et partager les données avec un collaborateurs (ou les réutiliser nous même plus tard):
expt1.days.to.flower.clean <- expt1 %>%
filter(!is.na(days.to.flower))
write_tsv(expt1.days.to.flower.clean, file = "../data/expt1_days_to_flower_clean.txt")
A partir ce ce que nous avons vu aujourd’hui:
Utilisez filter et select pour sélectionner vos données. Est-ce que cela vous permet de faire de nouveaux graphiques qui n’étaient pas possibles sur les données non sélectionnées?
N’oubliez pas d’utiliser des pipes (%>%) pour faire des chaines de commandes si vous utilisez plus d’une fonction sur vos données
Pour ceux qui n’ont pas de données, vous pouvez utiliser le tableau Pan_Rui_2017_flowering time_raw_data.txt (publié par Pan et Rui) dans le dossier data